package pailaidai.hc.com.mysvgdemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.geetest.sdk.Bind.GT3GeetestBindListener;
import com.geetest.sdk.Bind.GT3GeetestUtilsBind;
import com.geetest.sdk.GT3GeetestListener;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.PipedReader;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import pailaidai.hc.com.mysvgdemo.activity.FragmentActivity;
import pailaidai.hc.com.mysvgdemo.activity.MeetFaceActivity;
import pailaidai.hc.com.mysvgdemo.activity.RadarViewActivity;
import pailaidai.hc.com.mysvgdemo.base64pass.AESEncrypt;
import pailaidai.hc.com.mysvgdemo.base64pass.Key;
import pailaidai.hc.com.mysvgdemo.base64pass.RSASignature;
import pailaidai.hc.com.mysvgdemo.common.UrlString;
import pailaidai.hc.com.mysvgdemo.rxjava.NewService;
import pailaidai.hc.com.mysvgdemo.rxjava.RetrofitDemo;
import pailaidai.hc.com.mysvgdemo.rxjava.Student;
import pailaidai.hc.com.mysvgdemo.util.AppUtils;
import retrofit2.Retrofit;
import rx.Observable;
import rx.Observer;
import rx.functions.Action1;
import rx.functions.Func1;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText main_account, main_pass;
    private Button main_register, main_login;
    private GT3GeetestUtilsBind gt3GeetestUtils;
    private List<List<String>> totl = new ArrayList<>();
    private List<String> list = new ArrayList<>();
    private ThreadLocal<Boolean> threadLocal = new ThreadLocal<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initDate();
    }


    private void initView() {
        main_account = (EditText) findViewById(R.id.main_account);
        main_pass = (EditText) findViewById(R.id.main_pass);
        main_register = (Button) findViewById(R.id.main_register);
        main_login = (Button) findViewById(R.id.main_login);
        Observable.just("Hello", "World").subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.e("sssssss", s);
            }
        });
        Observable.just("正好","刚才").subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e("sssssss", s);
            }
        });
       
        Observable.just(new Student("张三",1),new Student("李四",2),new Student("王二",3))
                .map(new Func1<Student, String>() {
                    @Override
                    public String call(Student student) {
                        String name=student.getName();
                        return name;
                    }
                }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e("sssssssssssss",s);
            }
        });




    }

    private void initDate() {
        main_register.setOnClickListener(this);
        main_login.setOnClickListener(this);
       new RetrofitDemo().RetrofitOne();
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.main_register:
                Log.e("sssssss", "hhhhhhhhhhh");
                //（bind模式下）--点击后会有一个加载框，中间有一个gif在转动
                //在您acitvity的onCreate方法里面调用（初始化）
                gt3GeetestUtils = new GT3GeetestUtilsBind(MainActivity.this);
                gt3GeetestUtils.getGeetest(MainActivity.this, UrlString.captchaURL, UrlString.validateURL, null, new GT3GeetestBindListener() {
                    /**
                     * num 1 点击验证码的关闭按钮来关闭验证码
                     * num 2 点击屏幕关闭验证码
                     * num 3 点击返回键关闭验证码
                     */
                    @Override
                    public void gt3CloseDialog(int num) {
                        Log.e("yyygt3CloseDialog", "关闭验证弹框" + num);
                    }


                    /**
                     * 验证码加载准备完成
                     * 此时弹出验证码
                     */
                    @Override
                    public void gt3DialogReady() {
                        Log.e("yyyygt3DialogReady", "准备加载完成");
                    }


                    /**
                     * 拿到第一个url（API1）返回的数据
                     * 该方法只适用于不使用自定义api1时使用
                     */
                    @Override
                    public void gt3FirstResult(JSONObject jsonObject) {
                        Log.e("yyygt3FirstResult", "内容：" + jsonObject.toString());
                    }


                    /**
                     * 往API1请求中添加参数
                     * 该方法只适用于不使用自定义api1时使用
                     * 添加数据为Map集合
                     * 添加的数据以get形式提交
                     */
                    @Override
                    public Map<String, String> gt3CaptchaApi1() {

                        Map<String, String> map = new HashMap<String, String>();
                        Log.e("yyyygt3CaptchaApi1", "内容：" + map.size() + map.toString());
                        return map;
                    }

                    /**
                     * 设置是否自定义第二次验证ture为是 默认为false(不自定义)
                     * 如果为false后续会走gt3GetDialogResult(String result)拿到api2需要的参数
                     * 如果为true后续会走gt3GetDialogResult(boolean a, String result)拿到api2需要的参数
                     * result为二次验证所需要的数据
                     */
                    @Override
                    public boolean gt3SetIsCustom() {
                        Log.e("yyyyyyygt3SetIsCustom", "内容：gt3SetIsCustom");
                        return false;
                    }

                    /**
                     * 拿到第二个url（API2）需要的数据
                     * 该方法只适用于不使用自定义api2时使用
                     */
                    @Override
                    public void gt3GetDialogResult(String result) {
                        startActivity(new Intent(MainActivity.this, RadarViewActivity.class));
                        Log.e("yyygtgt3GetDialogResult", "内容:" + result);
                    }


                    /**
                     * 自定义二次验证，也就是当gtSetIsCustom为ture时才执行
                     * 拿到第二个url（API2）需要的数据
                     * 在该回调里面自行请求api2
                     * 对api2的结果进行处理
                     */
                    @Override
                    public void gt3GetDialogResult(boolean status, String result) {
                        Log.e("yyyyyyyesult2", "状态" + status + "内容:" + result);
                        if (status) {


                            /**
                             * 基本使用方法：
                             *
                             * 1.取出该接口返回的三个参数用于自定义二次验证
                             * JSONObject res_json = new JSONObject(result);
                             *
                             * Map<String, String> validateParams = new HashMap<>();
                             *
                             * validateParams.put("geetest_challenge", res_json.getString("geetest_challenge"));
                             *
                             * validateParams.put("geetest_validate", res_json.getString("geetest_validate"));
                             *
                             * validateParams.put("geetest_seccode", res_json.getString("geetest_seccode"));
                             *
                             * 新加参数可以继续比如
                             *
                             * validateParams.put("user_key1", "value1");
                             *
                             * validateParams.put("user_key2", "value2");
                             *
                             * 2.自行做网络请求，请求时用上前面取出来的参数
                             *
                             * 3.拿到网络请求后的结果，判断是否成功
                             *
                             * 二次验证成功调用 gt3GeetestUtils.gt3TestFinish();
                             * 二次验证失败调用 gt3GeetestUtils.gt3TestClose();
                             */
                        }
                    }


                    /**
                     * 需要做验证统计的可以打印此处的JSON数据
                     * JSON数据包含了极验每一步的运行状态和结果
                     */
                    @Override
                    public void gt3GeetestStatisticsJson(JSONObject jsonObject) {
                        Log.e("yyyyyyStatisticsJson", "" + jsonObject.toString());
                    }

                    /**
                     * 往二次验证里面put数据
                     * put类型是map类型
                     * 注意map的键名不能是以下三个：geetest_challenge，geetest_validate，geetest_seccode
                     * 该方法只适用于不使用自定义api2时使用
                     */
                    @Override
                    public Map<String, String> gt3SecondResult() {
                        Map<String, String> map = new HashMap<String, String>();
                        map.put("testkey", "12315");
                        return map;

                    }

                    /**
                     * 二次验证完成的回调
                     * 该方法只适用于不使用自定义api2时使用
                     * result为俄二次验证后的数据
                     * 根据二次验证返回的数据判断此次验证是否成功
                     * 二次验证成功调用 gt3GeetestUtils.gt3TestFinish();
                     * 二次验证失败调用 gt3GeetestUtils.gt3TestClose();
                     */
                    @Override
                    public void gt3DialogSuccessResult(String result) {
                        Log.d("yygDialogSuccessResult", "内容:" + result);
                        if (!TextUtils.isEmpty(result)) {
                            try {
                                JSONObject jobj = new JSONObject(result);
                                String sta = jobj.getString("status");
                                if ("success".equals(sta)) {
                                    gt3GeetestUtils.gt3TestFinish();
                                } else {
                                    gt3GeetestUtils.gt3TestClose();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        } else {
                            gt3GeetestUtils.gt3TestClose();
                        }
                    }

                    /**
                     * 验证过程错误
                     * 返回的错误码为判断错误类型的依据
                     */

                    @Override
                    public void gt3DialogOnError(String error) {
                        Log.e("yyyyyygt3DialogOnError", "gt3DialogOnError" + error);

                    }
                });
                //设置是否可以点击屏幕边缘关闭验证码
                gt3GeetestUtils.setDialogTouch(true);
                break;
            case R.id.main_login:
                startActivity(new Intent(MainActivity.this, MeetFaceActivity.class));
//                startActivity(new Intent(MainActivity.this, FragmentActivity.class));
//                String[] strings=new String[]{"提前预防","居安思危","防范于未然","亡羊补牢"};
//                Observable.from(strings).subscribe(new Action1<String>(){
//                    @Override
//                    public void call(String s) {
//                      Log.d("sssssss",s);
//                    }
//                });

//                base64();
//                AES mAes = new AES();
//                String mString = main_pass.getText().toString().trim();
//                byte[] mBytes = null;
//                try {
//                    mBytes = mString.getBytes("UTF8");
//                } catch (Exception e) {
//                    // TODO: handle exception
//                }
//                String enString = mAes.encrypt(mBytes);
//                Log.i("aes123", enString);
//                String deString = mAes.decrypt(enString);
//                Log.i("aes123", deString);
//                md5();
//                getMD5();
                break;
        }

    }

    private void base64() {
        String astring = main_pass.getText().toString().trim();
        try {
            String base64String = new String(Base64.encode(astring.getBytes("utf-8"), Base64.DEFAULT));
            Log.e("ssssssssssssBsea64", "jjjjjjjjjjjjjjj加密" + base64String);
            String aS = new String(Base64.decode(base64String.getBytes("utf-8"), Base64.DEFAULT));
            Log.e("ssssssssssssBsea64", "jjjjjjjjjjjjjjjj解密" + aS);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Log.e("ssssssssssss", astring);
        try {
            String aesSign = AESEncrypt.encryptCBC(new String(Base64.encode(astring.getBytes("utf-8"), Base64.DEFAULT)), Key.AES_KEY());
            Log.e("ssssssssssss", aesSign);
            String sign = RSASignature.sign(aesSign, Key.RSA_PRO_KEY());
            Log.e("ssssssssssss", sign);
        } catch (Exception e) {
            Log.e("sssssssssssshhhhh", e.toString());
            e.printStackTrace();
        }
    }

    private void md5() {
        String astring = main_pass.getText().toString().trim();
        MessageDigest md5;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest(astring.getBytes());
            String result = "";
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
            Log.e("ssssssssssssMD5:", result);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public void getMD5() {
        String device = AppUtils.getDeviceID(this);
        String time = getData(new Date(System.currentTimeMillis()), "ddMMyyyy");
        Log.e("sssssssssssstime:", time);
        String val = device + time;
        Log.e("ssssssssssss设备id:", device);
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("SHA-256");
            md5.update(val.getBytes());
            byte[] m = md5.digest();//加密
            String result32 = getString(m);
            String result16 = getString(m).toString().substring(8, 24);
            Log.e("ssssssssssssMD532:", result32);
            Log.e("ssssssssssssMD516:", result16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

    }

    private static String getString(byte[] b) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            int a = b[i];
            if (a < 0)
                a += 256;
            if (a < 16)
                buf.append("0");
            buf.append(Integer.toHexString(a));
        }
        return buf.toString();  //32位
    }

    private String getData(Date data, String string) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(string);
        return simpleDateFormat.format(data);
    }




}
